package br.com.ff.equipamento.session;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.ff.common.exception.EntidadeDuplicadaException;
import br.com.ff.common.exception.EntidadeNaoPodeSerRemovidaException;
import br.com.ff.commons.session.Repositorio;
import br.com.ff.equipamento.dao.EquipamentoDAO;
import br.com.ff.equipamento.entidade.Equipamento;
import br.com.ff.equipamento.to.EquipamentoTO;
import br.com.ff.veiculo.session.VeiculoLocal;
import br.com.ff.veiculo.to.VeiculoTO;
import br.com.ff.versao.entidade.Versao;

@Stateless
@Local(EquipamentoLocal.class)
public class EquipamentoSessionBean implements EquipamentoLocal {
	
	@EJB
	Repositorio repositorio;
	
	@EJB
	VeiculoLocal veiculoLocal;
	
	EquipamentoDAO equipamentoDAO;
	
	@SuppressWarnings("unused")
	@PostConstruct
	private void inicializar() {
		equipamentoDAO = getRepositorio().getEquipamentoDAO();
	}
	
	public EquipamentoTO findById(Long id) {		
		Equipamento equipamento = (Equipamento)getEquipamentoDAO().findById(Equipamento.class, id);
		EquipamentoTO result = equipamento.parseEquipamentoTO();
		return result;
	}
	
	public List<EquipamentoTO> findByParams(EquipamentoTO equipamentoTO) {
		
		Equipamento equipamento = new Equipamento(equipamentoTO);
		
		List<Equipamento> equipamentos = getEquipamentoDAO().findByParams(equipamento);
		
		List<EquipamentoTO> result = parseListTO(equipamentos);
		
		return result;
	}

	private List<EquipamentoTO> parseListTO(List<Equipamento> equipamentos) {
		List<EquipamentoTO> result = new ArrayList<EquipamentoTO>();
		for (Equipamento equipamentoVez : equipamentos) {
			result.add(equipamentoVez.parseEquipamentoTO());
		}
		return result;
	}

	public void atualizar(EquipamentoTO equipamentoTO)
			throws EntidadeDuplicadaException {
		
		validarSalvar(equipamentoTO);
		
		Equipamento equipamento = (Equipamento)getEquipamentoDAO().findById(
				Equipamento.class, equipamentoTO.getId());

		equipamento.setDdd(new Integer(equipamentoTO.getDdd()));
		equipamento.setPin(new Integer(equipamentoTO.getPin()));
		equipamento.setPuk(new Integer(equipamentoTO.getPuk()));
		equipamento.setSerial(equipamentoTO.getSerial());
		equipamento.setStatus(equipamentoTO.getStatus().getStatus());
		equipamento.setTelefone(new Integer(equipamentoTO.getTelefone()));
		equipamento.setVersao(new Versao(equipamentoTO.getVersaoTO()));
		
		equipamentoDAO.salvar(equipamento);
		
	}

	public void remover(Long id) throws EntidadeNaoPodeSerRemovidaException {
		
		Equipamento equipamento = (Equipamento)getEquipamentoDAO().findById(
				Equipamento.class, id);
		
		List<VeiculoTO> veiculoTOs = getVeiculoLocal().findVeiculoPorSerial(equipamento.getSerial());
		
		if (!veiculoTOs.isEmpty()) {
			throw new EntidadeNaoPodeSerRemovidaException("Equipamento esta sendo utilizado pelo veiculo: " 
					+ veiculoTOs.get(0).getPlaca());
		}
		
		equipamentoDAO.remover(equipamento);
		
	}

	public boolean salvar(EquipamentoTO equipamentoTO)
			throws EntidadeDuplicadaException {
				
		equipamentoTO.setSerial(gerarSerial());
		validarSalvar(equipamentoTO);
		
		Equipamento equipamento = new Equipamento(equipamentoTO);
		
		equipamentoDAO.salvar(equipamento);
		
		return false;
	}
	
	private String gerarSerial() {
		
		Date currenteDate = new Date();
		String timer = Long.toString(currenteDate.getTime());
		String serial = timer.substring(timer.length()-9, timer.length());
		return serial;
	}
	
	public List<EquipamentoTO> findEquipamentosDisponiveis() {
		
		List<Equipamento> equipamentos = getEquipamentoDAO().findEquipamentosDisponiveis();
		
		List<EquipamentoTO> listaTO = parseListTO(equipamentos);
		
		return listaTO;
	}
	
	private void validarSalvar(EquipamentoTO equipamentoTO) throws EntidadeDuplicadaException {
		
		Equipamento equipamento = new Equipamento(equipamentoTO);
		
		List<Equipamento> equipamentos = getEquipamentoDAO().findByParams(equipamento);
		
		if (!equipamentos.isEmpty() &&
				!equipamentos.get(0).getId().equals(equipamentoTO.getId())) {
			throw new EntidadeDuplicadaException("Ja existe equipamento: " + equipamentoTO.getSerial());
		}
	}

	public Repositorio getRepositorio() {
		return repositorio;
	}

	public void setRepositorio(Repositorio repositorio) {
		this.repositorio = repositorio;
	}

	public EquipamentoDAO getEquipamentoDAO() {
		return equipamentoDAO;
	}

	public void setEquipamentoDAO(EquipamentoDAO equipamentoDAO) {
		this.equipamentoDAO = equipamentoDAO;
	}

	public VeiculoLocal getVeiculoLocal() {
		return veiculoLocal;
	}

	public void setVeiculoLocal(VeiculoLocal veiculoLocal) {
		this.veiculoLocal = veiculoLocal;
	}
	
}
